#include "../os/api.h"

DWORD	os_gettickcount()
{
#ifdef WIN32
	return ::GetTickCount();
#else
	struct timespec ts;
    clock_gettime(CLOCK_MONOTONIC, &ts);
    return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
#endif
}

int		os_getmodulepath( char* sFileName, int nSize)
{
	if(os_getmodulefilename(sFileName, OS_MAX_PATH-1))
	{
		char* szSep = strrchr(sFileName, '//');

		int nLen = strlen(sFileName) - strlen(szSep);
		sFileName[nLen] = '\0';
		return 1;
	}
	else
		return 0;
}

int		os_getmodulefilename( char* sFileName, int nSize)
{
	//#ifdef WIN32
	//	//return ::GetModuleFileName( NULL, (LPWSTR)sFileName, MAX_PATH );
	//return 1;
	//#else
	//int ret = 0;
	//char sLine[1024] = { 0 };
	//void* pSymbol = (void*)"";
	//FILE *fp;
	//char *pPath;
	//fp = fopen ("/proc/self/maps", "r");
	//if ( fp != NULL )
	//{
	//	while (!feof (fp))
	//	{
	//		unsigned long start, end;
	//		if ( !fgets (sLine, sizeof (sLine), fp))
	//			continue;
	//		if ( !strstr (sLine, " r-xp ") || !strchr (sLine, '/'))
	//			continue;
	//		sscanf (sLine, "%lx-%lx ", &start, &end);
	//		if (pSymbol >= (void *) start && pSymbol < (void *) end)
	//		{
	//			char *tmp;
	//			size_t len;
	//			/* Extract the filename; it is always an absolute path */
	//			pPath = strchr (sLine, '/');
	//			/* Get rid of the newline */
	//			tmp = strrchr (pPath, '\n');
	//			if (tmp)
	//				*tmp = 0;
	//			ret = 1;
	//			strcpy( sFileName, pPath );
	//		}
	//	}
	//	fclose (fp);
	//}
	//return ret;
	//#endif

	return 1;
}

/*std::string	SecsToFormat(tm& t)
{
	char str[256];
	sprintf(str, "% 4d-%02d-%02d %02d-%02d-%02d",  t.tm_year - 100 + 2000, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
	return str;
}

std::string	SecsToFormatYMD(tm& t)
{
	char str[256];
	sprintf(str, "% 4d-%02d-%02d",  t.tm_year - 100 + 2000, t.tm_mon + 1, t.tm_mday);
	return str;
}

std::string	SecsToFormat(time_t secs)
{
	tm lt;
	localtime_r( &secs, &lt );
	return SecsToFormat(lt);
}

std::string	 SecsToFormatYMD(time_t secs)
{
	tm lt;
	localtime_r( &secs, &lt );
	return SecsToFormatYMD(lt);
}

time_t GetNowTime()
{
	time_t timep;
	time(&timep);
	return timep;
}

std::string GetNowTimeString()
{
	time_t timep;
	time(&timep);
	return SecsToFormat(timep);
}
*/

char* strupr(char* ioString)
{
    int i;
    int theLength = strlen(ioString);
    for (i=0; i<theLength; ++i)
    {
        ioString[i] = toupper(ioString[i]);
    }
    return ioString;
}

char* strlwr(char* ioString)
{
    int i;
    int theLength = strlen(ioString);
    for (i=0; i<theLength; ++i)
    {
        ioString[i] = tolower(ioString[i]);
    }
    return ioString;
}

int os_stricmp(const char* src, const char* dst)
{
#ifdef WIN32
    return stricmp(src, dst);
#else
	return strcasecmp(src, dst);
#endif
}

void strsplit( const string &src, const string &sep, vector<string>& result )
{
	string s;
	for( string::const_iterator i = src.begin(); i != src.end(); i++ )
	{
		if ( sep.find( *i ) != string::npos )
		{
			if( s.length() )
				result.push_back(s);
			s = "";
		}
		else
		{
			if(*i == '\t' || *i == '\n' || *i == '\r')
				continue;
			s += *i;
		}
	}

	if( s.length() )
		result.push_back(s);
}


//判断是否为目录

int IS_DIR(const char* path)
{
//#ifdef WIN32
//	return 0;
//#else
//    struct stat st;
//    lstat(path, &st);
//    return S_ISDIR(st.st_mode);
//#endif

	return 1;
}

//遍历文件夹de递归函数
void List_Files_Core(const char *path, int recursive, LPTRAVERSEDIRFUNC func)
{
//#ifdef WIN32
//
//#else
//	DIR *pdir;
//	struct dirent *pdirent;
//	char temp[256];
//	pdir = opendir(path);
//	if (pdir)
//	{
//		while (pdirent = readdir(pdir))
//		{
//			//跳过"."和".."
//			if (strcmp(pdirent->d_name, ".") == 0
//					|| strcmp(pdirent->d_name, "..") == 0)
//				continue;
//
//			sprintf(temp, "%s/%s", path, pdirent->d_name);
//
//			//printf("%s\n", temp);
//			//当temp为目录并且recursive为1的时候递归处理子目录
//			if (IS_DIR(temp))
//			{
//				if(recursive)
//					List_Files_Core(temp, recursive, func);
//			}
//			else
//			{
//				func(temp);
//			}
//		}
//	}
//	else
//	{
//		printf("opendir error:%s\n", path);
//	}
//	closedir(pdir);
//#endif
//
	return;
}
//遍历文件夹的驱动函数

void List_Files(const char *path, int recursive, LPTRAVERSEDIRFUNC func)
{
//#ifdef WIN32
//
//#else
//	int len;
//	char temp[256];
//
//	//去掉末尾的'/'
//	len = strlen(path);
//	strcpy(temp, path);
//	if (temp[len - 1] == '/')
//		temp[len - 1] = '\0';
//
//	if (IS_DIR(temp))
//	{
//		//处理目录
//		List_Files_Core(temp, recursive, func);
//	}
//	else //输出文件
//	{
//		func(path);
//		//printf("%s\n", path);
//	}
//#endif
	return ;
}

void FileTraverse(const char* path, LPTRAVERSEDIRFUNC func)
{
	List_Files(path, 1, func);
}

//#ifndef WIN32
//void init_daemon(void)
//{
//    int pid;
//
//    if(pid=fork())
//    {
//        exit(0);//是父进程，结束父进程
//    }
//    else if(pid < 0)
//    {
//        exit(1);
//    }
//
//    setsid();//第一子进程成为新的会话组长和进程组长并与控制终端分离
//
//    if(pid=fork())
//    {
//        exit(0);//是第一子进程，结束第一子进程
//    }
//    else if(pid< 0)
//    {
//        exit(1);
//    }
//}
//#endif
//
//#ifndef WIN32
////代码转换:从一种编码转为另一种编码
//int code_convert(char *from_charset, char *to_charset, char *inbuf, int inlen, char *outbuf, int outlen)
//{
//	iconv_t cd;
//	int rc;
//	char **pin = &inbuf;
//	char **pout = &outbuf;
//
//	cd = iconv_open(to_charset, from_charset);
//	if (cd==0)
//		return -1;
//
//	memset(outbuf, 0, outlen);
//	//printf("inlen=%d\n",inlen);
//	if (iconv(cd, pin, (size_t*)&inlen, pout, (size_t*)&outlen)==-1)
//		return -1;
//
//	iconv_close(cd);
//
//	return 0;
//}
//
////UNICODE码转为GB2312码
//int u2g(char *inbuf, size_t inlen, char *outbuf, size_t outlen)
//{
//	//return code_convert("UNICODE", "gb2312", inbuf, inlen, outbuf, outlen);
//	return code_convert("utf-8","GB2312",inbuf,inlen,outbuf,outlen);
//}
//
////GB2312码转为UNICODE码
//int g2u(char *inbuf, size_t inlen, char *outbuf, size_t outlen)
//{
//	return code_convert("GB2312","utf-8",inbuf,inlen,outbuf,outlen);
//}
//
//#endif


std::string GetNowTimeString()
{
	time_t timep;
	time(&timep);
	return SecsToFormat(timep);
}

std::string	SecsToFormat(time_t secs)
{
	#ifdef WIN32
	//注意下面两行的区别
	struct tm* ptm = localtime(&secs);
	return SecsToFormat(*ptm);

	#else
	tm lt;
	localtime_r( &secs, &lt );
	return SecsToFormat(lt);
	#endif
	
}

std::string	SecsToFormat(tm& t)
{
	char str[256];
	sprintf(str, "% 4d-%02d-%02d %02d-%02d-%02d",  t.tm_year - 100 + 2000, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
	return str;
}